<?php

namespace App\Http\Controllers;

use App\Models\Student;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Validator;
use Symfony\Component\HttpFoundation\Request;

class StudentController extends Controller{

    /**
     *
     */
    public function text(){

        //新增
//       $num =  DB::insert('insert into student(name,age) values(?,?)',['ggg',55]);
//       var_dump($num);

       //更新
//        $num = DB::update('update student set age = ? where name = ? ',[20,'ggg']);
//        var_dump($num);
       //查询
//        $student_list = DB::select('select * from student where age > ?',[14]);
//        $student_list = DB::select('select * from student ');
//        //dd($student_list);

       //删除
        $num = DB::delete('delete from student where age > ?',[14]);
        var_dump($num);

    }


    public function query1(){

        //查询构造器  新增
//        //返回布尔值
//        $bool = DB::table('student')->insert(['name'=>'dd','age'=>23]);
//        var_dump($bool);
//
//        //返回id 主键
//        $id = DB::table('student')->insertGetId(['name'=>'fff','age'=>55]);
//        var_dump($id);

        //返回布尔值  多数据插入
//        $bool = DB::table('student')->insert([
//            ['name'=>'lj','age'=>55],['name'=>'gh','age'=>15]
//        ]);
//        var_dump($bool);

        //查询构造器  更新

//        $num = DB::table('student')->where(['id'=>1001])->update(['age'=>20]);
//        var_dump($num);//影响条数

//        $num = DB::table('student')->where(['id'=>1001])->incr(['age'=>20]);
//        var_dump($num);//影响条数

        //自增
//        DB::table('student')->increment('age');
//
//        DB::table('student')->increment('age', 5);

        //自减
//        DB::table('student')->decrement('age');
//
//        DB::table('student')->decrement('age', 5);

        //DB::table('student')->where('id',1001)->decrement('age');
//        DB::table('student')->where(['id'=>1001])->decrement('age');

        //删除
//        DB::table('student')->delete();

//        DB::table('student')->where('id', '>', 1003)->delete();
//        DB::table('student')->where('id',1001)->delete();

        //如果你希望清除整张表，也就是删除所有列并将自增 ID 置为 0，可以使用 truncate 方法：
        //不返回任何东西
//        DB::table('student')->truncate();

        //查询
        echo "<pre>";
        //get()获取所有数据
//        $student_list = DB::table('student')->get();
//        var_dump($student_list);

//        $user = DB::table('student')->where('name', 'dd')->first();
//        var_dump($user);//查询的结果集
//        echo $user->name;//查询的结果集，键对应的值

//        $age = DB::table('student')->where('name', 'dd')->value('age');
//        var_dump($age);//age 字段对应的值

//        $names = DB::table('student')->pluck('name');
//        var_dump($names);//单独一列 name 的值

//        组块结果集
//        如果你需要处理成千上百条数据库记录，可以考虑使用chunk方法，该方法一次获取结果集的一小块，
//        然后传递每一小块数据到闭包函数进行处理，该方法在编写处理大量数据库记录的 Artisan 命令的时候非常有用。
//        比如，我们可以将处理全部 users 表数据处理成一次处理 100 条记录的小组块：
//        可以通过从闭包函数中返回false来终止组块的运行：

//        DB::table('student')->orderBy('id')->chunk(2, function($item) {
//            // 处理结果集...
//
//                return false;
//
//        });

//        使用 select 方法，你可以为查询指定自定义的 select 子句：

//        $users = DB::table('student')->select('name', 'email as user_email')->get();

//        distinct 方法允许你强制查询返回不重复的结果集：

//        $users = DB::table('student')->distinct()->get();

//        $orders = DB::table('student')
//            ->selectRaw('age * ? as age_two', [2])
//            ->get();
//        $orders = json_decode($orders,true);
//        var_dump($orders[0]['age_two']);

//        聚合函数
//
//        查询构建器还提供了多个聚合方法，如count, max, min, avg 和 sum，你可以在构造查询之后调用这些方法：
//
//        $users = DB::table('users')->count();
//
//        $price = DB::table('orders')->max('price');
//
//        当然，你可以联合其它查询子句和聚合函数来构建查询：
//
//        $price = DB::table('orders')
//            ->where('finalized', 1)
//            ->avg('price');


    }

    public function orm1(){

        //return 111;
        echo "<pre>";
        // all 方法返回模型表的所有结果
//        $student_list = Student::all();
//        var_dump($student_list);


//        $student_list = Student::where('age','>',18)
//
//            ->orderBy('age','desc')
//            ->take(2)
//            ->get();
//        var_dump($student_list);


//        组块结果集
//
//        如果你需要处理数据量很大的 Eloquent 结果集，可以使用 chunk 方法。chunk 方法会获取一个指定数量的 Eloquent 模型“组块”，并将其填充到给定闭包进行处理。使用 chunk 方法在处理大量数据集合时能够有效减少内存消耗：

//        Student::chunk(2, function ($students) {
//            foreach ($students as $student) {
//                //
//                if($student->age > 15){
//                    var_dump($student->age);
//                    return false;
//                }
//
//            }
//        });

       // 使用 find 和 first 获取单个记录。这些方法返回单个模型实例而不是模型集合：

        // 通过主键获取模型...
//        $student = Student::find(1);
//
//        // 获取匹配查询条件的第一个模型...
//        $student = Student::where('age', 1)->first();
//
//        //还可以通过传递主键数组来调用 find 方法，这将会返回匹配记录集合：
//
//        $students = Student::find([1, 2, 3]);
//
//
//        //count、sum、max，以及其它查询构建器提供的聚合函数。这些方法返回计算后的结果而不是整个模型实例：
//
//        $count = Student::where('age', 1)->count();
//        $max = Student::where('age', 1)->max('price');

        //新增

        //使用模型新增数据
//        $student = new Student();
//        $student->name = rand(1,999);
//        $student->age = rand(1,99);
//
//        $num = $student->save();
//        var_dump($num);

//        $student = Student::find(1022);
//        echo $student->created_at;
//        dd($student);

        //使用模型create方法
//       $student = Student::create(['name'=>'ffds','age'=>14]);
//       var_dump($student);

//        其它创建方法

//        firstOrCreate 和 firstOrNew。firstOrCreate 方法先尝试通过给定列/值对在数据库中查找记录，
//        如果没有找到的话则通过给定属性创建一个新的记录。
//
//firstOrNew 方法和 firstOrCreate 方法一样先尝试在数据库中查找匹配的记录，如果没有找到，
//        则返回一个新的模型实例。需要注意的是，通过 firstOrNew 方法返回的模型实例并没有持久化到数据库中，
//        你还需要调用 save 方法手动持久化
//        firstOrNew不会自动谢新纪录，


//        $student = Student::firstOrCreate(['name'=>'888']);
//        echo $student->name;

//        $student = Student::firstOrNew(['name'=>'987']);
//        $student->save();
//        echo $student->name;

//        更新
//
//        save 方法还可以用于更新数据库中已存在的模型。要更新一个模型，应该先获取它，设置你想要更新的属性，
//然后调用 save 方法。同样，updated_at 时间戳会被自动更新，所以没必要手动设置其值：
//
//        $student = Student::find(1003);
//       // dd($student);
//        $student->name = 'Ne44w';
//        $student->save();
//
//        批量更新
//
//        更新操作还可以同时修改给定查询提供的多个模型实例，在本例中，所有有效且 destination=San Diego
// 的航班都被标记为延迟：
//返回 更新条数
//       $num =   Student::where('age', '>', 18)
//            ->where('id', '>',1010)
//            ->update(['sex' => 1]);
//var_dump($num);
//        update 方法要求以数组形式传递键值对参数，代表着数据表中应该被更新的列。

//        如果模型已存在则更新，否则创建新模型的场景，Laravel 提供了一个 updateOrCreate 方法来一步完成。
//和 firstOrCreate 方法一样，updateOrCreate 方法会持久化模型，所以无需调用 save()：

        //如果存在name== 'New' 的记录，这更新age字段 为99
        //如果不存在，折现建一条记录 name=>New age=>99

//        $student = Student::updateOrCreate(
//            ['name' => 'New'],['age' => 99]
//        );
//        dd($student);

//        删除模型
//
//        要删除一个模型，调用模型实例上的 delete 方法：
        
//        $student = Student::find(1027);
//        $student->delete();
        
//        通过主键删除模型
//        
//        在上面的例子中，我们在调用 delete 方法之前从数据库中获取该模型，不过，如果你知道模型的主键的话，
//可以调用 destroy 方法直接删除而不需要获取它：
        
//        Student::destroy(1026);
//        Student::destroy([1024,1025]);
//        Student::destroy(1023,1022);
        
//        通过查询删除模型
//        
//        当然，你还可以通过查询删除多个模型，在本例中，我们删除所有被标记为无效的航班：
        //返回影响 行数
//        $deletedRows = Student::where('id','>', 1008)->delete();
//var_dump($deletedRows);

//        软删除  使用步骤：
//
//        1、在表中增加字段deleted_at，用代码添加：
//            Schema::table('flights', function ($table) { $table->softDeletes(); });
//        2、在Model中使用trait SoftDeletes
//        3、在Model中添加deleted_at到$dates成员变量

        //1、在每个文件里运行下面代码 添加字段 重复运行会报错
//        Schema::table('student', function ($table) {
//            $table->softDeletes();
//        });
//        $student_list = Student::all();
//dd($student_list);
//        $student->delete();
//        var_dump($num);

        return 123456;

    }


    public function section1(){

        $students = Student::get();

        $name = 'zmgood';
        $arr = array('name1','name2');

        return view('student.section1',[
            'name'=>$name,
            'arr'=>$arr,
            'students'=>$students,

        ]);

    }

    public function urlTest(){
        return "urlTest";
    }

    public function request1(Request $request)
    {
        //$name = $request->input('name');
       // $name = $request->input();

        var_dump($request->has(['name','eee']));
        exit();


        //
    }

    public function activity0()
    {
        return '活动宣传页';

    }
    public function activity1()
    {
        return '活动进行页111111111';

    }
    public function activity2()
    {
        return '活动进行页2222222222';

    }


    /*
     * 表格demo
     *
     */

    public function index(){

//        $student_list = Student::where('id','>','1002')->all();
//        $student_list = Student::where('id','>','1002')->get();
        $student_list = Student::orderBy('id','desc')->paginate(5);
//        $student_list = Student::simplePaginate(2);


        return view('student.index',[
            'student_list'=>$student_list
        ]);
    }

    public function create(Request $request){

        $student = new Student();

        if($request->isMethod('POST')){


            // 控制器验证
            /*$this->validate($request,[
                'Student.name'=> 'required|min:2|max:20',
                'Student.age'=> 'required|integer',
                'Student.sex'=> 'required|integer',
            ],[
                'required' => ':attribute 不能为空',
                'min' => ':attribute 最小长度2个字符',
                'max' => ':attribute 最大长度20个字符',
                'integer' => ':attribute 必须为整数',
            ],[
                'Student.name' => '姓名',
                'Student.age' => '年龄',
                'Student.sex' => '性别',
            ]);*/

            //Validator类验证
            $validator = Validator::make($request->input(),[
                'Student.name'=> 'required|min:2|max:20',
                'Student.age'=> 'required|integer',
                'Student.sex'=> 'required|integer',
            ],[
                'required' => ':attribute 不能为空',
                'min' => ':attribute 最小长度2个字符',
                'max' => ':attribute 最大长度20个字符',
                'integer' => ':attribute 必须为整数',
            ],[
                    'Student.name' => '姓名',
                    'Student.age' => '年龄',
                    'Student.sex' => '性别',
            ]);


            if($validator->fails()){

                return redirect()->back()->withErrors($validator)->withInput();
            }


            $data = $request->input('Student');

            //使用create方法 涉及批量赋值 先设置黑名单（$guarded） 或白名单 （$fillable）
            if(Student::create($data)){
                return redirect('student/index')->with('success','添加成功') ;

            }else{
                return redirect()->back() ;
            }
        }

//        var_dump($student->student_sex());
//        exit();

        return view('student.create',[
            'student' => $student,
        ]);
    }

    public function save(Request $request){

        $data = $request->input('Student');
        $student = new Student();
        $student->name = $data['name'];
        $student->age = $data['age'];
        $student->sex = $data['sex'];
        if($student->save()){
           return redirect('student/index') ;
        }else{
            return redirect()->back() ;
        }
        //return view('student.create');
    }


    public function update(Request $request,$id){

        $student = Student::find($id);

        if($request->isMethod('POST')){

            $data = $request->input('Student');

            //Validator类验证
            $validator = Validator::make($request->input(),[
                'Student.name'=> 'required|min:2|max:20',
                'Student.age'=> 'required|integer',
                'Student.sex'=> 'required|integer',
            ],[
                'required' => ':attribute 不能为空',
                'min' => ':attribute 最小长度2个字符',
                'max' => ':attribute 最大长度20个字符',
                'integer' => ':attribute 必须为整数',
            ],[
                    'Student.name' => '姓名',
                    'Student.age' => '年龄',
                    'Student.sex' => '性别',
            ]);


            if($validator->fails()){

                return redirect()->back()->withErrors($validator)->withInput();
            }
            //使用create方法 涉及批量赋值 先设置黑名单（$guarded） 或白名单 （$fillable）
            // if(Student::create($data)){
                if(Student::where('id',$id)->update($data)){
                return redirect('student/index')->with('success','修改成功') ;

            }else{
                return redirect()->back()->withErrors($validator)->withInput();
            }
        }

        return view('student.update',[
            'student'=>$student
        ]);
    }


    public function detail($id){

        $student = Student::find($id);

        return view('student.detail',[
            'student' => $student
        ]);
    }

    public function delete($id){
        $student = Student::find($id);
        if($student->delete()){

            return redirect('student/index')->with('success','删除成功');
        }else{
            return redirect('student/index')->with('error','删除失败');
        }
        
    }

    
}